Assignment (Indexed) {R}←X[I]←Y

Indexed Assignment is the Assignment function modified by the Indexing function.  The phrase [I]← is treated as the function for descriptive purposes.

Y may be any array.  X may be the name of any array or a selection from a named array (EXP X)[I]←Y, see Assignment (Selective)I must be a valid index specification.  The shape of Y must conform with the shape (implied) of the indexed structure defined by I.  If Y is a scalar or a 1-element vector it will be extended to conform.  A side effect of Indexed Assignment is to change the value of the indexed elements of X.

R is the value of Y.  If the result is not explicitly assigned or used it is suppressed.

⎕IO is an implicit argument of Indexed Assignment.

Three forms of indexing are permitted.

Simple Indexed Assignment

For vector X, I is a simple integer array whose items are from the set ⍳⍴R.  Elements of X identified by index positions I are replaced by corresponding elements of Y.

Examples

      +A←⍳5
1 2 3 4 5
 
      A[2 3]←10 ⋄ A
1 10 10 4 5
 

The last-most element of Y is assigned when an index is repeated in I:

      A[2 2]←100 101 ⋄ A
1 101 10 4 5

For matrix X, I is composed of two simple integer arrays separated by the semicolon character (;).  The arrays select indices from the rows and columns of X respectively.

Examples

      +B←2 3⍴'REDSUN'
RED
SUN
 
      B[2;2]←'O' ⋄ B
RED
SON

For higher-rank array X, I is a series of simple integer arrays with adjacent arrays separated by a single semicolon character (;).  Each array selects indices from an axis of X taken in row-major order.

Examples

      C
11 12 13
14 15 16
 
21 22 23
24 25 26
 
      C[1;1;3]←103 ⋄ C
11 12 103
14 15  16
 
21 22  23
24 25  26

An indexing array may be ELIDED.  That is, if an indexing array is omitted from the Kth axis, the indexing vector ⍳(⍴X)[K] is implied:

      C[;1;2 3]←2 2⍴112 113 122 123 ⋄ C
11 112 113
14  15  16
 
21 122 123
24  25  26
 
      C[;;]←0 ⋄ C
0 0 0
0 0 0
 
0 0 0
0 0 0

Choose Indexed Assignment

The index specification I is a non-simple integer array. Each item identifies a single element of X by a set of indices with one element per axis of X in row-major order.

Examples

      C
11 12 13 14
21 22 23 24
 
      C[⊂1 1]←101 ⋄ C
101 12 13 14
 21 22 23 24
 
      C[(1 2) (2 3)]←102 203 ⋄ C
101 102  13 14
 21  22 203 24
 
      C[2 2⍴(1 3)(2 4)(2 1)(1 4)]←2 2⍴103 204 201 104 ⋄ C
101 102 103 104
201  22 203 204

A scalar may be indexed by the enclosed empty vector:

      S
10
      S[⊂⍳0]←⊂'VECTOR' ⋄ S
 VECTOR 
      S[⊂⍳0]←5 ⋄ S
5

Choose Indexed Assignment may be used very effectively in conjunction with Index Generator () and Structural functions in order to assign into an array:

      C
11 12 13 14
21 22 23 24
 
      ⍳⍴C
1 1  1 2  1 3  1 4
2 1  2 2  2 3  2 4
 
      C[1 1⍉⍳⍴C]←1 2 ⋄ C
 1 12 13 14
21  2 23 24
 
      C[2 ¯1↑⍳⍴C]←99 ⋄ C
 1 12 13 99
21  2 23 99

Reach Indexed Assignment

The index specification I is a non-simple integer array, each of whose items reach down to a nested element of X.  The items of an item of I are simple vectors (or scalars) forming sets of indices that index arrays at successive levels of X starting at the top-most level.  A set of indices has one element per axis at the respective level of nesting of X in row-major order.

Examples

      D←(2 3⍴⍳6)(2 2⍴'SMITH' 'JONES' 'SAM' 'BILL')
 
      D
 1 2 3   SMITH  JONES
 4 5 6   SAM    BILL
 
      ≡J←⊂2 (1 2)
¯3
 
      D[J]←⊂'WILLIAMS' ⋄ D
 1 2 3   SMITH  WILLIAMS
 4 5 6   SAM    BILL
 
      D[(1 (1 1))(2 (2 2) 1)]←10 'W' ⋄ D
 10 2 3   SMITH  WILLIAMS
  4 5 6   SAM    WILL
 
      E
 GREEN  YELLOW  RED
 
      E[⊂2 1]←'M' ⋄ E
 GREEN  MELLOW  RED

The context of indexing is important.  In the last example, the indexing method is determined to be Reach rather than Choose since E is a vector, not a matrix as would be required for Choose.  Observe that:

      ⊂2 1 ←→ ⊂(⊂2),(⊂1)

Note that for any array A, A[⊂⍬] represents a scalar quantity, which is the whole of A, so:

      A←5⍴0
      A
0 0 0 0 0
      A[⊂⍬]←1
      A
1

Combined Indexed and Selective Assignment

Instead of X being a name, it may be a selection from a named array, and the statement is of the form (EXP X)[I]←Y.

      MAT←4 3⍴'Hello' 'World'
      (2↑¨MAT)[1 2;]←'#'
      MAT
 ##llo  ##rld  ##llo 
 ##rld  ##llo  ##rld 
 Hello  World  Hello 
 World  Hello  World
      MAT←4 3⍴'Hello' 'World'
      ⎕ML←1 ⍝ ∊ is Enlist
     (∊MAT)[2×⍳⌊0.5×⍴∊MAT]←'#'
      MAT
 H#l#o  #o#l#  H#l#o 
 #o#l#  H#l#o  #o#l# 
 H#l#o  #o#l#  H#l#o 
 #o#l#  H#l#o  #o#l#